package org.example.coursemangementserver.common.utils;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Map;

/**
 * Jwt令牌类，用于生成并下发令牌，以及校验令牌
 */
@Slf4j
public class JwtUtil {

    /**
     *生成令牌
     * @param claims//设置的信息
     * @param signKey//令牌的秘钥
     * @param expire//令牌的有效时间
     * @return
     */
    public static String createJwt(Map<String, Object> claims, String signKey, long expire){//构建并返回令牌
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS256,signKey)
                //指定签名算法和签名秘钥
                .setClaims(claims)
                //设置自定义部分的内容，也就是数据
                .setExpiration(new Date(System.currentTimeMillis()+expire))
                //设置令牌有效时间
                .compact();//获得一个字符串类型的返回值
    }

    /**
     *解密JWT令牌
     * @param jwt//令牌内容
     * @param signKey//令牌签名加密算法的秘钥
     * @return
     */
    public static Claims parseJWT(String jwt,String signKey){//解析令牌内容并判断其有效性，同时返回解析出来的令牌里面的数据
        //一般在拦截器或是过滤器里面调用
        return Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                //传入令牌,注意这里调用的是parseClaimsJws而不是parseClaimsJwt
                .getBody();//拿到自定义内容
    }
}
